// 数字枚举 Up使用初始化为1，其余的成员会从1开始自动增长。Dowm为2， Left为3
enum Direction {
  Up = 1,
  Down,
  Left,
  Right
}
// 完全可以不使用初始化器 现在Up的值为0，Down的值为1等等
enum Direction2 {
  Up,
  Down,
  Left,
  Right
}
// 使用枚举的属性来访问枚举成员，使用枚举的名字来访问枚举类型
enum Direction3 {
  No = 0,
  Yes = 10
}
function respond (recipient: string, message: Direction3) : void {
  console.log('message', recipient + message)
}
respond('Princess ', Direction3.Yes) // message Princess 10


function getSomeValue () : number{
  return 1
}
enum E {
  A = getSomeValue(),
  // B, // 第一个用方法获得，这时候这种不带初始化器的枚举是不被允许的
  // C
}

// 字符串枚举
enum Direction4 {
  Up = 'Up',
  Down = 'Dowm'
}
// 异构枚举
enum Direction5 {
  No = 0,
  Yes = 'Yes'
}


// 联合枚举与枚举成员的类型
enum ShapeKind {
  Circle,
  Square,
}

interface Circle {
  kind: ShapeKind.Circle;
  radius: number;
}

interface Square {
  kind: ShapeKind.Square;
  sideLength: number;
}

// let c: Circle = {
//   kind: ShapeKind.Square,
//   //    ~~~~~~~~~~~~~~~~ Error!
//   radius: 100,
// }


// 运行时的枚举
enum E {
  X, Y, Z
}
function f(obj: {X: number}) {
  console.log(obj.X)
  return obj.X
}
f(E)

// 反向映射
enum Enum {
  A
}
let a = Enum.A
let nameOfA = Enum[a] 
console.log('nameOfA', nameOfA) // A


